home *** CD-ROM | disk | FTP | other *** search
/ Deutsche Edition 1 / Deutsche Edition 1.iso / amok / amok_lha / amok15.lha / Seafarers_Manual / Source / C5P2.mod < prev    next >
Text File  |  1993-08-15  |  6KB  |  185 lines

  1. MODULE C5P2;  (* Chapter 5  Problem 2 *)
  2.  
  3.   (* From the book "Modula-2  A Seafarer's Manual and Shipyard Guide" *)
  4.   (* Page 161   adapted "Amiga M2Modula-2"   11 Mar 1988 *)
  5.  
  6. (* terminal input/ouput *)
  7. FROM InOut IMPORT ReadCard,        (* read cardinal value *)
  8.                   ReadString,        (* read string *)
  9.                   WriteLn,        (* write cr/line feed *)
  10.                   WriteString;        (* write string *)
  11.                   
  12. (* file input & output tools *)
  13. FROM FileSystem IMPORT File,        (* file definition *)
  14.                        Response,    (* includes 'done' *)
  15.                        Lookup,        (* look up file on disk *)
  16.                        SetPos,        (* set position *)
  17.                        Close,        (* close *)
  18.                        ReadChar,    (* read character *)
  19.                        WriteChar;    (* write character *)
  20. FROM ASCII IMPORT eol;
  21.                                               
  22. CONST
  23.   LenCrDataIn = 35;    (* length of data per crew member in IN file,
  24.                            includes line feed *)
  25.   LenCrDataOut = 55;    (* length of data per crew member in OUT file,
  26.                            includes line feed *)
  27.   LenCrNum = 8;        (* length of crew mem number in file *)
  28.   
  29. VAR
  30.   FL1,
  31.   FL2 : File;                (* contains file definition &
  32.                                            status info *)
  33.   CrewNum : [1..100];            (* crew mem. number *)
  34.   JobDes : ARRAY [0..25] OF CHAR;    (* job description *)
  35.   Name : ARRAY [0..19] OF CHAR;        (* crew mem. name *)
  36.   CharNum : ARRAY [0..7] OF CHAR;    (* crew mem. number as character *)
  37.   i : CARDINAL;                (* loop counter *)
  38.     
  39. (* Initialize file *)
  40. PROCEDURE InitFL (VAR FL : File;        (* file defin. *)
  41.                   FLName : ARRAY OF CHAR);    (* file name *)
  42.                   
  43.   BEGIN
  44.     Lookup (FL,                (* look up file on disk *)
  45.             FLName,
  46.             2048,            (* buffersize *)
  47.             FALSE);
  48.   END InitFL;
  49.  
  50.  
  51. (* Read description from file for specified crew member *)
  52. PROCEDURE ReadDes (VAR FL : File;        (* file defin. *)
  53.                    CrNum : CARDINAL;        (* crew mem num *)
  54.                    VAR Num : ARRAY OF CHAR;    (* crew mem num as char *)
  55.                    VAR Des : ARRAY OF CHAR);    (* job des. *)
  56.  
  57.   VAR
  58.     i : CARDINAL;            (* array index *)
  59.     ch : CHAR;                (* holds character *)
  60.     
  61.   BEGIN                    (* set file position *)
  62.     SetPos (FL,                (* file *)
  63.             (CrNum-1)*LenCrDataIn);    (* character position *)
  64.     IF (FL.res = done) THEN        (* skip if error *)
  65.       i := 0;
  66.       REPEAT                (* read crewmem number as char *)
  67.         ReadChar (FL,
  68.                   ch);
  69.         Num[i] := ch;
  70.         INC (i);
  71.       UNTIL ((i > CARDINAL (HIGH (Num))) OR (FL.res # done));
  72.       i := 0;
  73.       REPEAT                (* read description *)
  74.         ReadChar (FL,            (* char by char *)
  75.                   ch);
  76.         Des[i] := ch;            (* abort if error *)
  77.         INC (i);
  78.       UNTIL ((i > CARDINAL (HIGH (Des))) OR (FL.res # done));
  79.     END;   (* IF *)
  80.   END ReadDes;
  81.   
  82.  
  83. (* Update name on file for specified crew member *)
  84. PROCEDURE UpdtFL (VAR FL : File;        (* file defin. *)
  85.                   CrNum : CARDINAL;        (* crew mem num *)
  86.                   Num : ARRAY OF CHAR;        (* crew mem num as char *)
  87.                   CrName : ARRAY OF CHAR;    (* crew mem name *)
  88.                   Des : ARRAY OF CHAR);        (* job des. *)
  89.  
  90.   VAR
  91.     i : CARDINAL;            (* array index *)
  92.     ch : CHAR;                (* holds character *)
  93.     
  94.   BEGIN
  95.     SetPos (FL,                (* file *)
  96.             ((CrNum-1)*LenCrDataOut));    (* character position *)
  97.     IF (FL.res = done) THEN        (* skip if error *)
  98.       i := 0;
  99.       REPEAT                (* write description *)
  100.         ch := Num[i];            (* char by char *)
  101.         WriteChar (FL,
  102.                    ch);
  103.         INC (i);
  104.       UNTIL ((i > CARDINAL (HIGH (Num))) OR (FL.res # done));
  105.       i := 0;
  106.       REPEAT                (* write description *)
  107.         ch := CrName[i];        (* char by char *)
  108.         WriteChar (FL,
  109.                    ch);
  110.         INC (i);
  111.       UNTIL ((i > CARDINAL (HIGH (CrName))) OR (FL.res # done));
  112.       i := 0;
  113.       REPEAT                (* write description *)
  114.         ch := Des[i];            (* char by char *)
  115.         WriteChar (FL,
  116.                    ch);
  117.         INC (i);
  118.       UNTIL ((i > CARDINAL (HIGH (Des))) OR (FL.res # done));
  119.       WriteChar (FL, eol); 
  120.     END;   (* IF *)
  121.   END UpdtFL;
  122.   
  123.  
  124. BEGIN   (* main body *)
  125.   WriteLn;
  126.   WriteString ("Start file update");
  127.   
  128.   InitFL (FL1,                        (* initialize first file *)
  129.           "CREW1.TXT");                    (* drive/path/file name *)
  130.   InitFL (FL2,                        (* initialize second file *)
  131.           "CREW3.TXT");                             (* drive/path/file name *)
  132.   IF ((FL1.res = done) AND (FL2.res = done)) THEN   (* error? *)
  133.     i := 0;                        (* no *)
  134.     LOOP
  135.       INC (i);
  136.       IF (i > 100) THEN
  137.         EXIT;
  138.       END;
  139.       WriteLn;
  140.       CrewNum := i;
  141.       
  142.       ReadDes (FL1,CrewNum,CharNum,JobDes);    (* read des. from file *)
  143.       IF (FL1.res # done) THEN            (* error? *)
  144.         EXIT;                    (* yes *)
  145.       END;   (* IF *)
  146.       
  147.       WriteLn; WriteLn;
  148.       WriteString ("old job description of Crewmember");
  149.       WriteLn;
  150.       WriteString (CharNum);
  151.       WriteString (": ");
  152.       WriteString (JobDes);
  153.       
  154.       WriteLn;
  155.       WriteString ("enter Crewmember name: ");
  156.       ReadString (Name);
  157.       
  158.       UpdtFL (FL2,CrewNum,CharNum,Name,JobDes);    (* update name on file 2 *)
  159.       IF (FL2.res # done) THEN            (* error? *)
  160.         EXIT;                    (* yes *)
  161.       END;   (* IF *)
  162.       
  163.     END;   (* LOOP *)
  164.     
  165.   END;   (* IF done *)
  166.   
  167.   IF (FL1.res = done) THEN        (* error on file? *)
  168.     Close (FL1);            (* no - close it *)
  169.   END;
  170.   
  171.   IF (FL2.res = done) THEN        (* error on file? *)
  172.     Close (FL2);            (* no - close it *)
  173.   END;
  174.   
  175.   IF ((FL1.res # done) OR (FL2.res # done)) THEN
  176.     WriteLn;                (* error encountered *)
  177.     WriteString ("error encountered while accessing file");
  178.   END;
  179.   
  180.   WriteLn;
  181.   WriteString ("End file update");
  182.   WriteLn;
  183.   
  184. END C5P2.
  185.